/****************************************************/
//
//
//
//
//
//
/****************************************************/

#define PIN_SCE   10
#define PIN_RESET 9
#define PIN_DC    8
#define PIN_SDIN  7
#define PIN_SCLK  6
#define PIN_LED  5

#define LCD_C     LOW
#define LCD_D     HIGH

#define LCD_X     84
#define LCD_Y     48


static const byte bigNumber[][10]={
  0x00, 0x00, 0xF8, 0x1F, 0xFC, 0x3F, 0x0E, 0x70, 0x06, 0x60, 0x06, 0x60, 0x0E, 0x70, 0xFC, 0x3F, 0xF8, 0x1F, 0x00, 0x00,  //' Code for  char 0
    0x00, 0x00, 0x30, 0x60, 0x38, 0x60, 0x1C, 0x60, 0x0E, 0x60, 0xFE, 0x7F, 0xFE, 0x7F, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,  //' Code for  char 1
    0x00, 0x00, 0x18, 0x60, 0x0C, 0x70, 0x06, 0x78, 0x06, 0x7C, 0x06, 0x6E, 0x0E, 0x67, 0xFC, 0x63, 0xF8, 0x61, 0x00, 0x00,  //' Code for  char 2
    0x00, 0x00, 0x08, 0x30, 0x0C, 0x70, 0x06, 0x60, 0x82, 0x60, 0xC2, 0x70, 0xE6, 0x39, 0xBC, 0x1F, 0x18, 0x0F, 0x00, 0x00,  //' Code for  char 3
    0x00, 0x00, 0xC0, 0x07, 0xE0, 0x0F, 0x70, 0x0C, 0x38, 0x0C, 0x1C, 0x0C, 0x0E, 0x7E, 0x06, 0x7E, 0x02, 0x0C, 0x00, 0x00,  //' Code for  char 4
    0x00, 0x00, 0xFE, 0x30, 0xFE, 0x60, 0xC6, 0x60, 0xC6, 0x60, 0xC6, 0x60, 0xC6, 0x71, 0x86, 0x3F, 0x00, 0x1F, 0x00, 0x00,  //' Code for  char 5
    0x00, 0x00, 0xF8, 0x1F, 0xFC, 0x3F, 0x8E, 0x71, 0xC6, 0x60, 0xC6, 0x60, 0xC6, 0x71, 0x86, 0x3F, 0x04, 0x1F, 0x00, 0x00,  //' Code for  char 6
    0x00, 0x00, 0x06, 0x00, 0x06, 0x60, 0x06, 0x78, 0x06, 0x1E, 0x86, 0x07, 0xE6, 0x01, 0x7E, 0x00, 0x1E, 0x00, 0x00, 0x00,  //' Code for  char 7
    0x00, 0x00, 0x38, 0x1E, 0x7C, 0x3F, 0xEE, 0x71, 0xC6, 0x60, 0xC6, 0x60, 0xEE, 0x71, 0x7C, 0x3F, 0x38, 0x1E, 0x00, 0x00,  //' Code for  char 8
    0x00, 0x00, 0x78, 0x10, 0xFC, 0x30, 0xCE, 0x61, 0x86, 0x61, 0x86, 0x61, 0xCE, 0x61, 0xFC, 0x3F, 0xF8, 0x1F, 0x00, 0x00,  //' Code for  char 9
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  //' Code for char :
};


static const byte ASCII[][5] =
{
  {
    0x00, 0x00, 0x00, 0x00, 0x00      } // 20  
  ,{
    0x00, 0x00, 0x5f, 0x00, 0x00      } // 21 !
  ,{
    0x00, 0x07, 0x00, 0x07, 0x00      } // 22 "
  ,{
    0x14, 0x7f, 0x14, 0x7f, 0x14      } // 23 #
  ,{
    0x24, 0x2a, 0x7f, 0x2a, 0x12      } // 24 0x
  ,{
    0x23, 0x13, 0x08, 0x64, 0x62      } // 25 %
  ,{
    0x36, 0x49, 0x55, 0x22, 0x50      } // 26 &
  ,{
    0x00, 0x05, 0x03, 0x00, 0x00      } // 27 '
  ,{
    0x00, 0x1c, 0x22, 0x41, 0x00      } // 28 (
  ,{
    0x00, 0x41, 0x22, 0x1c, 0x00      } // 29 )
  ,{
    0x14, 0x08, 0x3e, 0x08, 0x14      } // 2a *
  ,{
    0x08, 0x08, 0x3e, 0x08, 0x08      } // 2b +
  ,{
    0x00, 0x50, 0x30, 0x00, 0x00      } // 2c ,
  ,{
    0x08, 0x08, 0x08, 0x08, 0x08      } // 2d -
  ,{
    0x00, 0x60, 0x60, 0x00, 0x00      } // 2e .
  ,{
    0x20, 0x10, 0x08, 0x04, 0x02      } // 2f /
  ,{
    0x3e, 0x51, 0x49, 0x45, 0x3e      } // 30 0
  ,{
    0x00, 0x42, 0x7f, 0x40, 0x00      } // 31 1
  ,{
    0x42, 0x61, 0x51, 0x49, 0x46      } // 32 2
  ,{
    0x21, 0x41, 0x45, 0x4b, 0x31      } // 33 3
  ,{
    0x18, 0x14, 0x12, 0x7f, 0x10      } // 34 4
  ,{
    0x27, 0x45, 0x45, 0x45, 0x39      } // 35 5
  ,{
    0x3c, 0x4a, 0x49, 0x49, 0x30      } // 36 6
  ,{
    0x01, 0x71, 0x09, 0x05, 0x03      } // 37 7
  ,{
    0x36, 0x49, 0x49, 0x49, 0x36      } // 38 8
  ,{
    0x06, 0x49, 0x49, 0x29, 0x1e      } // 39 9
  ,{
    0x00, 0x36, 0x36, 0x00, 0x00      } // 3a :
  ,{
    0x00, 0x56, 0x36, 0x00, 0x00      } // 3b ;
  ,{
    0x08, 0x14, 0x22, 0x41, 0x00      } // 3c <
  ,{
    0x14, 0x14, 0x14, 0x14, 0x14      } // 3d =
  ,{
    0x00, 0x41, 0x22, 0x14, 0x08      } // 3e >
  ,{
    0x02, 0x01, 0x51, 0x09, 0x06      } // 3f ?
  ,{
    0x32, 0x49, 0x79, 0x41, 0x3e      } // 40 @
  ,{
    0x7e, 0x11, 0x11, 0x11, 0x7e      } // 41 A
  ,{
    0x7f, 0x49, 0x49, 0x49, 0x36      } // 42 B
  ,{
    0x3e, 0x41, 0x41, 0x41, 0x22      } // 43 C
  ,{
    0x7f, 0x41, 0x41, 0x22, 0x1c      } // 44 D
  ,{
    0x7f, 0x49, 0x49, 0x49, 0x41      } // 45 E
  ,{
    0x7f, 0x09, 0x09, 0x09, 0x01      } // 46 F
  ,{
    0x3e, 0x41, 0x49, 0x49, 0x7a      } // 47 G
  ,{
    0x7f, 0x08, 0x08, 0x08, 0x7f      } // 48 H
  ,{
    0x00, 0x41, 0x7f, 0x41, 0x00      } // 49 I
  ,{
    0x20, 0x40, 0x41, 0x3f, 0x01      } // 4a J
  ,{
    0x7f, 0x08, 0x14, 0x22, 0x41      } // 4b K
  ,{
    0x7f, 0x40, 0x40, 0x40, 0x40      } // 4c L
  ,{
    0x7f, 0x02, 0x0c, 0x02, 0x7f      } // 4d M
  ,{
    0x7f, 0x04, 0x08, 0x10, 0x7f      } // 4e N
  ,{
    0x3e, 0x41, 0x41, 0x41, 0x3e      } // 4f O
  ,{
    0x7f, 0x09, 0x09, 0x09, 0x06      } // 50 P
  ,{
    0x3e, 0x41, 0x51, 0x21, 0x5e      } // 51 Q
  ,{
    0x7f, 0x09, 0x19, 0x29, 0x46      } // 52 R
  ,{
    0x46, 0x49, 0x49, 0x49, 0x31      } // 53 S
  ,{
    0x01, 0x01, 0x7f, 0x01, 0x01      } // 54 T
  ,{
    0x3f, 0x40, 0x40, 0x40, 0x3f      } // 55 U
  ,{
    0x1f, 0x20, 0x40, 0x20, 0x1f      } // 56 V
  ,{
    0x3f, 0x40, 0x38, 0x40, 0x3f      } // 57 W
  ,{
    0x63, 0x14, 0x08, 0x14, 0x63      } // 58 X
  ,{
    0x07, 0x08, 0x70, 0x08, 0x07      } // 59 Y
  ,{
    0x61, 0x51, 0x49, 0x45, 0x43      } // 5a Z
  ,{
    0x00, 0x7f, 0x41, 0x41, 0x00      } // 5b [
  ,{
    0x02, 0x04, 0x08, 0x10, 0x20      } // 5c ¥
  ,{
    0x00, 0x41, 0x41, 0x7f, 0x00      } // 5d ]
  ,{
    0x04, 0x02, 0x01, 0x02, 0x04      } // 5e ^
  ,{
    0x40, 0x40, 0x40, 0x40, 0x40      } // 5f _
  ,{
    0x00, 0x01, 0x02, 0x04, 0x00      } // 60 `
  ,{
    0x20, 0x54, 0x54, 0x54, 0x78      } // 61 a
  ,{
    0x7f, 0x48, 0x44, 0x44, 0x38      } // 62 b
  ,{
    0x38, 0x44, 0x44, 0x44, 0x20      } // 63 c
  ,{
    0x38, 0x44, 0x44, 0x48, 0x7f      } // 64 d
  ,{
    0x38, 0x54, 0x54, 0x54, 0x18      } // 65 e
  ,{
    0x08, 0x7e, 0x09, 0x01, 0x02      } // 66 f
  ,{
    0x0c, 0x52, 0x52, 0x52, 0x3e      } // 67 g
  ,{
    0x7f, 0x08, 0x04, 0x04, 0x78      } // 68 h
  ,{
    0x00, 0x44, 0x7d, 0x40, 0x00      } // 69 i
  ,{
    0x20, 0x40, 0x44, 0x3d, 0x00      } // 6a j 
  ,{
    0x7f, 0x10, 0x28, 0x44, 0x00      } // 6b k
  ,{
    0x00, 0x41, 0x7f, 0x40, 0x00      } // 6c l
  ,{
    0x7c, 0x04, 0x18, 0x04, 0x78      } // 6d m
  ,{
    0x7c, 0x08, 0x04, 0x04, 0x78      } // 6e n
  ,{
    0x38, 0x44, 0x44, 0x44, 0x38      } // 6f o
  ,{
    0x7c, 0x14, 0x14, 0x14, 0x08      } // 70 p
  ,{
    0x08, 0x14, 0x14, 0x18, 0x7c      } // 71 q
  ,{
    0x7c, 0x08, 0x04, 0x04, 0x08      } // 72 r
  ,{
    0x48, 0x54, 0x54, 0x54, 0x20      } // 73 s
  ,{
    0x04, 0x3f, 0x44, 0x40, 0x20      } // 74 t
  ,{
    0x3c, 0x40, 0x40, 0x20, 0x7c      } // 75 u
  ,{
    0x1c, 0x20, 0x40, 0x20, 0x1c      } // 76 v
  ,{
    0x3c, 0x40, 0x30, 0x40, 0x3c      } // 77 w
  ,{
    0x44, 0x28, 0x10, 0x28, 0x44      } // 78 x
  ,{
    0x0c, 0x50, 0x50, 0x50, 0x3c      } // 79 y
  ,{
    0x44, 0x64, 0x54, 0x4c, 0x44      } // 7a z
  ,{
    0x00, 0x08, 0x36, 0x41, 0x00      } // 7b {
  ,{
    0x00, 0x00, 0x7f, 0x00, 0x00      } // 7c |
  ,{
    0x00, 0x41, 0x36, 0x08, 0x00      } // 7d }
  ,{
    0x10, 0x08, 0x08, 0x10, 0x08      } // 7e ←
  ,{
    0x78, 0x46, 0x41, 0x46, 0x78      } // 7f →
};

/*********************  *********************/
// Function Name:    processSyncMessage
// Parametter:       none
// Return value:     none
// Description:      
/****************************************************/
void LcdWrite(byte dc, byte data)
{
  digitalWrite(PIN_DC, dc);
  digitalWrite(PIN_SCE, LOW);
  shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data);
  digitalWrite(PIN_SCE, HIGH);
}

/*********************  *********************/
// Function Name:    processSyncMessage
// Parametter:       none
// Return value:     none
// Description:      
/****************************************************/
void gotoXY(int x, int y) {
  LcdWrite(0, 0x80 | x);  // Column.
  LcdWrite(0, 0x40 | y);  // Row.  ?
}

/*********************  *********************/
// Function Name:    processSyncMessage
// Parametter:       none
// Return value:     none
// Description:      
/****************************************************/
void LcdClear(void)
{
  for (int index = 0; index < LCD_X * LCD_Y / 8; index++)
  {
    LcdWrite(LCD_D, 0x00);
  }
}

/*********************  *********************/
// Function Name:    processSyncMessage
// Parametter:       none
// Return value:     none
// Description:      
/****************************************************/
void LcdCharacter(char character)
{
  LcdWrite(LCD_D, 0x00);
  for (int index = 0; index < 5; index++)
  {
    LcdWrite(LCD_D, ASCII[character - 0x20][index]);
  }
  LcdWrite(LCD_D, 0x00);
}

/*********************  *********************/
// Function Name:    processSyncMessage
// Parametter:       none
// Return value:     none
// Description:      
/****************************************************/
void LcdString(char *characters)
{
  while (*characters)
  {
    LcdCharacter(*characters++);
  }
}

/*********************  *********************/
// Function Name:    processSyncMessage
// Parametter:       none
// Return value:     none
// Description:      
/****************************************************/
void LcdPrintBigNumber(unsigned char number,unsigned char xPos, unsigned char yPos){
  unsigned char index;
  gotoXY(xPos,yPos);
  for ( index = 0; index < 20; index+=2)
  {
    LcdWrite(LCD_D, bigNumber[number*2][index]);
  }
  gotoXY(xPos,yPos+1);
  for(index =1;index<20;index+=2){
    LcdWrite(LCD_D, bigNumber[number*2][index]);
  }
}



/*********************  *********************/
// Function Name:    processSyncMessage
// Parametter:       none
// Return value:     none
// Description:      
/****************************************************/
//This takes a large array of bits and sends them to the LCD
void LCDBitmap(char my_array[]){
  for (int index = 0 ; index < (LCD_X * LCD_Y / 8) ; index++)
    LcdWrite(LCD_D, my_array[index]);
}

/*********************  *********************/
// Function Name:    processSyncMessage
// Parametter:       none
// Return value:     none
// Description:      
/****************************************************/
void LcdInitialise(void)
{
  pinMode(PIN_SCE, OUTPUT);
  pinMode(PIN_RESET, OUTPUT);
  pinMode(PIN_DC, OUTPUT);
  pinMode(PIN_SDIN, OUTPUT);
  pinMode(PIN_SCLK, OUTPUT);
  digitalWrite(PIN_RESET, LOW);
  digitalWrite(PIN_RESET, HIGH);
  LcdWrite(LCD_C, 0x21 );  // LCD Extended Commands.
  LcdWrite(LCD_C, 0xba );  // Set LCD Vop (Contrast). 
  LcdWrite(LCD_C, 0x04 );  // Set Temp coefficent. //0x04
  LcdWrite(LCD_C, 0x14 );  // LCD bias mode 1:48. //0x13
  LcdWrite(LCD_C, 0x0C );  // LCD in normal mode.
  LcdWrite(LCD_C, 0x20 );
  LcdWrite(LCD_C, 0x0C );
}

/*********************  *********************/
// Function Name:    processSyncMessage
// Parametter:       none
// Return value:     none
// Description:      
/****************************************************/
//Ham xuat gia tri ra man hinh
void displayScreen()
{
  unsigned int tmp = analogRead(TEMPSENSOR);
  tmp = tmp *83/1000;
  LcdPrintBigNumber((getHour()/10)%10,0,0);
  LcdPrintBigNumber(getHour()%10,10,0);
  LcdPrintBigNumber(10,20,0);
  LcdPrintBigNumber((getMinute()/10)%10,30,0); 
  LcdPrintBigNumber(getMinute()%10,40,0);
  LcdPrintBigNumber(10,50,0);
  LcdPrintBigNumber((getSecond()/10)%10,60,0);
  LcdPrintBigNumber(getSecond()%10,70,0);
  gotoXY(0,2);
  LcdCharacter((getDay()/10)%10 + '0');
  LcdCharacter(getDay()%10 + '0');
  LcdCharacter('/');
  LcdCharacter((getMonth()/10)%10 + '0');
  LcdCharacter(getMonth()%10 + '0');
  LcdCharacter('/');
  LcdCharacter((getYear()/1000)%10 + '0');
  LcdCharacter((getYear()/100)%10 + '0');
  LcdCharacter((getYear()/10)%10 +'0');
  LcdCharacter(getYear()%10 + '0');
  gotoXY(0,3);
  LcdString("Nhiet do bay gio la: ");
  LcdCharacter((tmp/10)%10 + '0');
  LcdCharacter(tmp%10 + '0');
}

